package org.example.big_data;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.junit.jupiter.api.Test;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;


public class JWT_test {
    @Test
    public void testCreateToken() { //测试生成token而写的随意方法
        Map<String,String> claims = new HashMap<>();
        claims.put("id","11");
        claims.put("username","wangjj");
        String token = JWT.create()  //JWT.create()生成token的方法，链式调用其他方法指定token的头部和载荷,所谓令牌也就是一个字符串而已
                .withClaim("user",claims)   //添加载荷，所谓载荷，就是我们要添加的一些信息，比如登录用户提交的用户名和密码等信息(用Map数组字典接收这个名为user的字典)，跟随token一起加密后传输
                .withExpiresAt(new Date(System.currentTimeMillis()+1000*60*60*12))   //设置token的过期时间:当前系统的时间+有效时间(毫秒)
                .sign(Algorithm.HMAC256("wangjj"));  //签名，将token进行加密，防止token被人篡改.Algorithm.HMAC256是加密算法，其中的参数wangjj（一串字符串）就是密钥，不可泄露，加密解密时使用同一个密钥

        System.out.println(token); //生成token的方法，链式调用其他方法指定token的头部和载荷
    }
    @Test
    public void testCheckToken() {
        String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkIjoiMTEiLCJ1c2VybmFtZSI6IndhbmdqaiJ9LCJleHAiOjE3Mzc3NTIzNDl9.O2_gKRKa3fhsaIkfHT9L3YqrVkzW4fGX8sUpvpoUsMk";
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("wangjj")).build(); //JWT.require:将收到的token编译解析（变为原数据）的方法，指定同样的加密算法Algorithm.HMAC256，指定同样的密钥
                    //build()生成验证器，解析器来验证Token是否有效
        DecodedJWT decodedJWT = jwtVerifier.verify(token);  //jwtVerifier.verify(): 验证token是否有效，返回DecodedJWT对象，其中包含了token的所有信息，如果不匹配则报错
        Map<String,Claim> claims = decodedJWT.getClaims(); //decodedJWT（解析对象）.getClaims();获取token中的所有的载荷信息
        System.out.println(claims.get("user"));  //获取载荷中名为user的字典
    }
}
